const User = require('../models/User')
const sequelize = require('../models/db')
const { common, department, admin } = require('../utils/userTypes')
/**
 * 添加记录,注册用户是调用,只有普通用户可以注册
 * @param {*} userObj 包含userName和loginPwd的对象
 * @returns json格式的记录实例
 */
const addUser = async ({ userName, loginPwd, userType, permission }) => {
  const res = await User.create({
    userName,
    loginPwd,
    userType,
    permission,
  })
  return res.toJSON() // 返回json格式的记录
}

/**
 * 更新记录,密码,权限,登陆状态等更新操作
 * @param {Number} id 要更新的记录的id
 * @param {*} userObj 要更新的内容
 * @returns 返回数组, 数组中只有一个元素, 表示更新的记录数
 */
const updateUser = async (id, userObj) => {
  const res = await User.update(userObj, {
    where: {
      id, // id: id
    },
  })
  return res
}
/**
 * 删除记录
 * @param {Number} id 要删除的记录的id
 * @returns
 */
const deleteUser = async id => {
  const res = await User.destroy({
    where: {
      id,
    },
  })
  return res
}

/**
 * 根据id查询记录
 * @param {Number} id 要查询记录的id
 * @returns id对应的记录
 */
const getUserById = async id => {
  const res = await User.findByPk(id)
  if (res) return res.toJSON()
  return res
}

/**
 * 查询所有记录
 * @returns 所有记录
 */
const getAllUsers = async () => {
  const res = await User.findAll({
    attributes: ['id', 'userName', 'loginPwd', 'userType', 'loginStatus'],
    group: ['userType', 'id'], //分组,按照userType进行分组,id用于对每个分组中的记录按照id进行再次分组得到每条记录
    //将分组按照admin,department,userType进行排序
    order: [[sequelize.literal(`FIELD(userType, '${admin}', '${department}', '${common}')`)]], //加单引号告诉SQL这是字符串
  })
  return JSON.parse(JSON.stringify(res))
}

/**
 * 根据userName查找单个记录
 * @param {Number} userName
 * @param {Boolean} instance 是否返回User实例,设置为true则返回User实例, 否则返回布尔值, 默认false
 * @returns 对应的记录或者表示是否存在的布尔值
 */
const hasUserName = async (userName, instance = false) => {
  if (!userName) return false
  const user = await User.findOne({
    where: {
      userName,
    },
  })
  switch (instance) {
    case true:
      if (user) return user.toJSON()
      return user
    default:
      // 判断查询返回的记录的原型链上是否有User的prototype, 若不在, 则说明查询结果不是User实例
      return user instanceof User
  }
}
module.exports = {
  addUser,
  updateUser,
  deleteUser,
  getUserById,
  getAllUsers,
  hasUserName,
}
